package com.senyint.sys.tools;

import java.io.InputStream;
import java.io.OutputStream;
import java.io.SequenceInputStream;
import java.util.Enumeration;
import java.util.Vector;

/**
 * {@code HideAvi}类 隐藏rar到图片中
 * <p>
 * 
 * @author WangNaiFei, WangNaiFei@senyint.com
 * @date 2017年2月5日 下午2:27:19
 * @version 1.0
 * @since jdk1.7+
 */
public class HideAvi {

	/**
	 * 隐藏文件
	 * <p>
	 * 
	 * @author WangNaiFei, WangNaiFei@senyint.com
	 * @date 2017年2月5日 下午2:31:54
	 * @version 1.0
	 * @param imgIn 读取图片流（二进制）
	 * @param hideInputStream 隐藏文件流（二进制）
	 * @param out 合并后的文件输出流
	 * @throws Exception
	 */
	public void hideFileUseImage(InputStream imgIn, InputStream hideInputStream, OutputStream out) throws Exception {

		/**
		 * 第一种方法：使用ArrayList集合 //3.往集合中添加字节流对象，并关联源（源头） List<FileInputStream> list = new ArrayList<FileInputStream>(); //添加字节流对象 list.add(imgIn); list.add(aviIn); //4.获取集合的枚举对象 // Iterator<FileInputStream> it = list.iterator(); Enumeration<FileInputStream> en = Collections.enumeration(list);
		 */
		/**
		 * 第二种方法：使用Vector集合 最终目的都是要获取取出枚举对象
		 */
		// 3.创建集合，添加字节流对象
		Vector<InputStream> vector = new Vector<InputStream>();
		vector.add(imgIn);
		vector.add(hideInputStream);
		// 4.获取集合的枚举对象，理解为迭代------是因为序列流中需要Enumeration类型的参数
		/**
		 * 查看api，发现迭代器与枚举有两点不同 1.迭代器允许调用者利用定义良好的语义在迭代期间从迭代器所指向的 collection 移除元素。 2.方法名称得到了改进。 迭代器就是多了个remove()方法，从迭代器指向的 collection 中移除迭代器返回的最后一个元素。
		 */
		Enumeration<InputStream> en = vector.elements();

		// 5.创建序列流对象，接受集合的枚举对象，完成对流的合并
		SequenceInputStream sis = new SequenceInputStream(en);

		// 6.缓冲字节数组
		byte[] buf = new byte[4096];
		int len = 0;
		while ((len = sis.read(buf)) != -1) {
			out.write(buf, 0, len);
		}

		// 7.关闭资源
		sis.close();
		out.close();

	}

}